<?php

require_once '/usr/share/php/symfony/autoload/sfCoreAutoload.class.php';

/**
 * compras actions.
 *
 * @package    tercermilenio
 * @subpackage compras
 * @author     Your name here
 * @version    SVN: $Id: actions.class.php 12474 2008-10-31 10:41:27Z fabien $
 */
class comprasActions extends autoComprasActions {
    const CANT_MINIMA=1;

    public function executeIndex(sfWebRequest $request) {
        // sorting
        if ($request->getParameter('sort') && $this->isValidSortColumn($request->getParameter('sort'))) {
            $this->setSort(array($request->getParameter('sort'), $request->getParameter('sort_type')));
        }

        // pager
        if ($request->getParameter('page')) {
            $this->setPage($request->getParameter('page'));
        }

        $carro = sfContext::getInstance()->getUser()->setAttribute('compra', null);

        $this->pager = $this->getPager();
        $this->sort = $this->getSort();
    }

    /**
     * Ejecuta la acción Nuevo del modulo Compras
     * @author Maximiliano Vicente
     * @param sfWebRequest $request
     */
    public function executeNew(sfWebRequest $request) {



                $this->title = 'Nueva Compra';
                $this->form = $this->configuration->getForm();
                $this->compras = $this->form->getObject();


                $paramFormCompra = $request->getParameter('compras');
                if (!empty($paramFormCompra)) {
                    if ($request->isMethod('post')) {

                        $this->form->bind($request->getParameter('compras'));

                        if ($this->form->isValid()) {

                            $carro = $this->getUser()->getAttribute('compra');
                            if (!empty($carro)) {

                                $nroFactura = $this->form->getValue('cpr_nro_factura');
                                $idProveedor = $this->form->getValue('cpr_proveedor');
                                $fecha = $this->form->getValue('cpr_fecha');

                                $proveedor = ProveedoresPeer::retrieveByPK($idProveedor);

                                if (!empty($proveedor)) {
                                    $cm = ComprasManager::getInstance();
                                    $cm->checkOut($nroFactura, $proveedor->getPvdId(), $fecha);
                                    $this->getUser()->setFlash('notice', 'La compra se ha registrado exitosamente.');
                                    $this->redirect('@compras');
                                } else {
                                    $this->getUser()->setFlash('error', 'El proveedor no existe.');
                                }
                            } else {
                                $this->getUser()->setFlash('error', 'No hay productos agregados a la compra.');
                            }
                        }
                    }
                }

    }

    /**
     *
     * @param sfWebRequest $request 
     */
    public function executeEdit(sfWebRequest $request) {

        //Objeto y form Compra
        $this->compras = $this->getRoute()->getObject();
        $this->form = $this->configuration->getForm($this->compras);
        sfContext::getInstance()->getUser()->setAttribute('compra', null);
        $this->cprId = $this->compras->getCprId();

        $modulo = $request->getParameter('module');
        $accion = $request->getParameter('action');

        //if (($modulo == 'compras') && ($accion == 'verDetalle')) {
        //Cargar el detalle en sesión

        $c = new Criteria();
        $c->add(DetalleComprasPeer::DET_CPR_COMPRA, $this->cprId);
        $detalleCompra = DetalleComprasPeer::doSelect($c);

        foreach ($detalleCompra as $fila) {
            $producto = ProductosPeer::retrieveByPK($fila->getDetCprArticulo(), $fila->getDetCprTalle());
            if (!empty($producto)) {

                $cm = ComprasManager::getInstance();
                $cantidad = $fila->getDetCprCantidad();
                $cm->agregarProducto($producto, $cantidad);
            }
        }
        //}

        if ($request->isMethod('post')) {

            //$idCompra = $request->getParameter('cpr');

            $this->form->bind($request->getParameter('compras'));

            if ($this->form->isValid()) {

                $carro = $this->getUser()->getAttribute('compra');
                if (!empty($carro)) {

                    $nroFactura = $this->form->getValue('cpr_nro_factura');
                    $idProveedor = $this->form->getValue('cpr_proveedor');
                    $fecha = $this->form->getValue('cpr_fecha');

                    $proveedor = ProveedoresPeer::retrieveByPK($idProveedor);

                    if (!empty($proveedor)) {
                        $cm = ComprasManager::getInstance();
                        $cm->checkOut($nroFactura, $proveedor->getPvdId(), $fecha, $idCompra);
                        $this->getUser()->setFlash('notice', 'La compra se ha registrado exitosamente.');
                        //$this->redirect('@compras');
                    } else {
                        $this->getUser()->setFlash('error', 'El proveedor no existe.');
                    }
                } else {
                    $this->getUser()->setFlash('error', 'No hay productos agregados a la compra.');
                }
            }
        }
    }

    public function executeUpdate(sfWebRequest $request) {
        $this->compras = $this->getRoute()->getObject();
        $this->form = $this->configuration->getForm($this->compras);

        $this->processForm($request, $this->form);

        //$this->setTemplate('edit');
        $this->redirect('@compras');
    }

    /**
     *
     * @param sfWebRequest $request
     */
    public function executeBuscarProductos(sfWebRequest $request) {
        //$this->compras = $this->getRoute()->getObject();

        $params = $request->getParameterHolder()->getAll();
        //form Busqueda de productos

        $formBusqueda = new BuscarProductosFormFilter();
        $paramFormBusqueda = $request->getParameter('productos_filters');
        if (!empty($paramFormBusqueda)) {
            if ($request->isMethod('post')) {

                $formBusqueda->bind($request->getParameter('productos_filters'));

                if ($formBusqueda->isValid()) {

                    $articulo = $formBusqueda->getValue('pro_articulo');
                    $talle = $formBusqueda->getValue('pro_talle');
                    $descripcion = $formBusqueda->getValue('pro_descripcion');

                    if (!empty($articulo) && !empty($talle) && !empty($descripcion)) {
                        $c = new Criteria();
                        $c->add(ProductosPeer::PRO_ARTICULO, '%' . $articulo['text'] . '%', Criteria::LIKE);
                        $c->add(ProductosPeer::PRO_TALLE, '%' . $talle['text'] . '%', Criteria::LIKE);
                        $c->add(ProductosPeer::PRO_DESCRIPCION, '%' . $descripcion['text'] . '%', Criteria::LIKE);
                        $this->productos = ProductosPeer::doSelect($c);
                    }
                }
            }
        }
        $this->formBusqueda = $formBusqueda;
    }

    /**
     *
     * @param sfWebRequest $request
     */
    public function executeEliminarProducto(sfWebRequest $request) {
        $articulo = $request->getParameter('pro_art');
        $talle = $request->getParameter('pro_tal');

        $this->compras = $this->getRoute()->getObject();
        $cprId = $request->getParameter('cpr_id');

        $producto = ProductosPeer::retrieveByPK($articulo, $talle);

        if (!empty($producto)) {

            $cm = new ComprasManager();
            $cm->eliminarProducto($producto);
        } else {
            sfContext::getInstance()->getUser()->setFlash('notice', 'El producto no existe.');
        }

        //$this->redirect('compras/detalleCompra?cpr_id='.$cprId);
    }

    /**
     *
     * @param sfWebRequest $request
     */
    public function executeEliminarCantProducto(sfWebRequest $request) {
        $articulo = $request->getParameter('pro_art');
        $talle = $request->getParameter('pro_tal');

        $cprId = $request->getParameter('cpr_id');


        $producto = ProductosPeer::retrieveByPK($articulo, $talle);

        if (!empty($producto)) {
            $cm = new ComprasManager();
            $cm->eliminarCantProducto($producto);
        } else {
            sfContext::getInstance()->getUser()->setFlash('notice', 'El producto no existe.');
        }
        $this->redirect('compras/detalleCompra?cpr_id=' . $cprId);
    }

    /**
     *
     * @param sfWebRequest $request
     */
    public function executeDetalleCompra(sfWebRequest $request) {

        if ($request->hasParameter('cpr_id')) {
            $this->cprId = $request->getParameter('cpr_id');
        }
        //$detalleCompra = null;
        //$compra = ComprasPeer::retrieveByPK($cprId);

        if ($request->hasParameter('act')) {

            $articulo = $request->getParameter('pro_art');
            $talle = $request->getParameter('pro_tal');
            $action = $request->getParameter('act');

            $producto = ProductosPeer::retrieveByPK($articulo, $talle);

            if (!empty($producto)) {
                if ($action == 'add') {
                    $cm = ComprasManager::getInstance();
                    $cm->agregarProducto($producto);
                } elseif ($action == 'del') {
                    $cm = new ComprasManager();
                    $cm->eliminarCantProducto($producto);
                } elseif ($action == 'quit') {
                    $cm = new ComprasManager();
                    $cm->eliminarProducto($producto);
                }
            } else {
                sfContext::getInstance()->getUser()->setFlash('notice', 'El producto no existe.');
            }
        }

        $carro = sfContext::getInstance()->getUser()->getAttribute('compra');
        if (!empty($carro)) {
            $this->carro = $carro;
            $cm = ComprasManager::getInstance();
            $this->total = $cm->getTotal();
        }
        /* if (!empty($compra)) {
          $c = new Criteria();
          $c->add(DetalleComprasPeer::DET_CPR_COMPRA, $cprId, Criteria::EQUAL);
          $detalleCompra = DetalleComprasPeer::doSelectJoinProductos($c);
          } else {

          }

          $this->detalleCompra = $detalleCompra; */
    }

    /**
     *
     * @param sfWebRequest $request
     */
    public function executeVaciarCarro(sfWebRequest $request) {

        $cm = ComprasManager::getInstance();

        if ($cm->estaVacio()) {
            sfContext::getInstance()->getUser()->setFlash('notice', 'La compra ya está vacía.');
        } else {
            $cm->vaciarCarro();
            if ($cm->estaVacio()) {
                sfContext::getInstance()->getUser()->setFlash('notice', 'Los productos han sido eliminados de la compra exitosamente.');
            } else {
                sfContext::getInstance()->getUser()->setFlash('notice', 'Los productos no han podido ser eliminados.');
            }
        }
        $this->redirect('compras/new');
    }

    protected function processForm(sfWebRequest $request, sfForm $form) {

        $form->bind($request->getParameter($form->getName()), $request->getFiles($form->getName()));
        if ($form->isValid()) {
            $notice = $form->getObject()->isNew() ? 'The item was created successfully.' : 'The item was updated successfully.';
            $nroFactura = $form->getValue('cpr_nro_factura');
            $idProveedor = $form->getValue('cpr_proveedor');
            $values = $form->getValues();
            $fecha = $form->getValue('cpr_fecha');
            $idCompra = $form->getValue('cpr_id');

            //$compras = $form->save();

            $cm = ComprasManager::getInstance();
            $checkout = $cm->checkOut($nroFactura, $idProveedor, $fecha, $idCompra);

            $this->dispatcher->notify(new sfEvent($this, 'admin.save_object', array('object' => $compras)));

            if ($request->hasParameter('_save_and_add')) {
                $this->getUser()->setFlash('notice', $notice . ' You can add another one below.');

                $this->redirect('@compras_new');
            } else {
                $this->getUser()->setFlash('notice', $notice);

                //$this->redirect(array('sf_route' => 'compras_edit', 'sf_subject' => $compras));
                $this->redirect('@compras');
            }
        } else {
            $this->getUser()->setFlash('error', 'La compra no ha sido guardado debido a algunos errores.', false);
        }
    }

    /**
     * Personalizado para eliminar el detalle antes que la compra misma
     * @param sfWebRequest $request 
     */
    public function executeDelete(sfWebRequest $request) {
        $request->checkCSRFProtection();

        $this->dispatcher->notify(new sfEvent($this, 'admin.delete_object', array('object' => $this->getRoute()->getObject())));

        $compra = $this->getRoute()->getObject();
        $idCompra = $compra->getCprId();


        $con = Propel::getConnection();

        try {
            //abrimos la transacción
            $con->beginTransaction();

            //operaciones pertinentes contra la base de datos
            //borrar el detalle antes
            $detalleBorrado = DetalleComprasPeer::BorrarDetalleDeCompra($idCompra);
            $this->getRoute()->getObject()->delete();
            $this->getUser()->setFlash('notice', 'The item was deleted successfully.');
            //si todo va bien guardamos los cambios
            $con->commit();
        } catch (Exception $e) {

            // Hacemos rollback de los cambios en caso de fallo
            $con->rollback();
            $this->getUser()->setFlash('error', 'El item no pudo ser borrado.');
        }

        $this->redirect('@compras');
    }

    /**
     * Personalizado para eliminar el detalle antes de cada compra a eliminarse
     * @param sfWebRequest $request
     */
    protected function executeBatchDelete(sfWebRequest $request) {
        $ids = $request->getParameter('ids');

        $count = 0;
        $con = Propel::getConnection();

        try {
            //abrimos la transacción
            $con->beginTransaction();

            //operaciones pertinentes contra la base de datos
            foreach (ComprasPeer::retrieveByPks($ids) as $object) {
                $this->dispatcher->notify(new sfEvent($this, 'admin.delete_object', array('object' => $object)));

                $idCompra = $object->getCprId();
                //borrar el detalle antes
                $detalleBorrado = DetalleComprasPeer::BorrarDetalleDeCompra($idCompra);

                    $object->delete();
                    if ($object->isDeleted()) {
                        $count++;
                    }             
            }
            //si todo va bien guardamos los cambios
            $con->commit();
            $this->getUser()->setFlash('notice', 'Los ítems han sido borrados exitosamente.');
            //$this->redirect('@compras');
        } catch (Exception $e) {

            // Hacemos rollback de los cambios en caso de fallo
            $con->rollback();
            $this->getUser()->setFlash('error', 'Algunos de los ítems no pudieron ser borrados.');
        }


        //if ($count >= count($ids)) {
            //$this->getUser()->setFlash('notice', 'The selected items have been deleted successfully.');
        //} else {
            //$this->getUser()->setFlash('error', 'A problem occurs when deleting the selected items.');
        //}
    }

}

